package top.mschen.blog.common.test;

/**
 * 首先，我们来看看不考虑多线程共享数据的情况。

 现在有小明、小刚、小红三人在同一家银行，分别向各自账户存入 200 元钱：
 */
public class ThreadLocalTets {

    public static void main(String[] args) {
        Bank bank = new Bank();
        Thread xMThread = new Thread(() -> bank.deposit(200), "小明");
        Thread xGThread = new Thread(() -> bank.deposit(200), "小刚");
        Thread xHThread = new Thread(() -> bank.deposit(200), "小红");
        xMThread.start();
        xGThread.start();
        xHThread.start();
    }
}


/**
 * 结果
 * 小红--当前账户余额为：1000
 小红--存入 200 后账户余额为：1200
 小刚--当前账户余额为：1200
 小刚--存入 200 后账户余额为：1400
 小明--当前账户余额为：1400
 小明--存入 200 后账户余额为：1600
 因为共享了同一个变量
 */
class Bank {

//    private int money = 1000;
//    public void deposit(int money) {
//        String threadName = Thread.currentThread().getName();
//        System.out.println(threadName + "--当前账户余额为：" + this.money);
//        this.money += money;
//        System.out.println(threadName + "--存入 " + money + " 后账户余额为：" + this.money);
//        try {
//            Thread.sleep(1000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//    }

//    ThreadLocal<Integer> account = new ThreadLocal<Integer>(){
//        @Override
//        protected Integer initialValue() {
//            return 1000;
//        }
//    };
    ThreadLocal<Integer> account = ThreadLocal.withInitial(()->{
        return 1000;
    });


    public void deposit(int money) {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + "--当前账户余额为：" + account.get());
        account.set(account.get() + money);
        System.out.println(threadName + "--存入 " + money + " 后账户余额为：" + account.get());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
